package Socket;

import Controlador.Arbitro;
import Controlador.PeritoColision;
import Modelo.Escenario;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Servidor {

    public ServerSocket serverSocket;
    Integer puerto=5000;
    Arbitro arbitro = new Arbitro();
    PeritoColision perito;
    

    Socket socketServicio= null;
    ObjectOutputStream salida1, salida, salida0;

    Escenario escena;
    int autoId=0;
    ServidorEscucha escucha1, escucha2;
    ServidorEscribe escribe; 

     Socket socket[];

    public Servidor() {

        socket=new Socket[2];

      
      escribe = new ServidorEscribe(this);


        escena = new Escenario("escenario servidor");

        escena.addFigurasEstaticas();
        escena.addExtras();

        perito = new PeritoColision(escena.getFigura());
        
        escena.addAutos(perito, arbitro); //autos con perito y arbitro
        escena.addPolicias(perito, arbitro); //polis con motor, perito y arbitro
        escena.addSemaforos(true); //semaforos con motor

        

        try {
            serverSocket=new ServerSocket(puerto);

            while(autoId<2){
            socket[autoId]=esperoCliente();

            System.out.println("llegó cliente ");


            salida0 = new ObjectOutputStream( new BufferedOutputStream(socket[autoId].getOutputStream() ));


            salida0.writeObject(autoId);
            salida0.flush();

            System.out.println ("Enviado " + autoId);

             autoId++; // incremento para el proximo
            }

        }catch(IOException ex){

            System.out.println(ex);
            System.exit(1);
        }

                escucha1 = new ServidorEscucha(this,0);
                escucha2 = new ServidorEscucha(this,1);
                escucha1.start(); //este hilo recibe los eventos de teclas de los clientes
                escucha2.start();

               escribe.start();  //este actualiza las pantallas de los clientes
               
               
               
               
               

    }

    private Socket esperoCliente() {

              try {
                    System.out.println("estoy escuchando");
                    //Al aceptar la conexión el server obtiene un nuevo socket sobre un puerto diferente
                    socketServicio = serverSocket.accept();
                    System.out.println ("Conectado con cliente de " + socketServicio.getInetAddress());
              } catch( Exception e ) {System.out.println( e );}
               return socketServicio;
    }


    public void enviarVector(){
     for(Socket s: socket){
        try {
            
            //TODO: se lo debe enviar a todos los clientes conectados.
            
            salida = new ObjectOutputStream( new BufferedOutputStream(s.getOutputStream() ));
            
            
            //Para probar el envio de parametros en vez del vector figuras completo, 
            //intercambiar las lineas siguientes 
            
            salida.writeObject(escena.getFigura());
            //salida.writeObject(escena.getParametros());
            
            
            salida.flush();
      //      System.out.println("Enviado vector de figuras");
            
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

    }


   


    public void cerrar(){
    //Cerrar los canales de entrada y salida que se hayan abierto
    try {
        salida.close();
        //entrada.close();
        } catch (IOException ex) {System.out.println("Error al cerrar");
        }
}


      public static void main(String[] args) {

                new Servidor();


       }
}


